//package com.yunquan.ohana.utils
//
//import android.content.ContentResolver
//import android.content.Context
//import android.database.Cursor
//import android.graphics.Bitmap
//import android.media.MediaMetadataRetriever
//import android.net.Uri
//import android.os.Build
//import android.os.Bundle
//import android.provider.MediaStore
//import com.yunquan.ohana.entity.PhotoGroupEntity
//import com.yunquan.ohana.entity.PhotosEntity
//import java.io.File
//
//class PhotosUtils {
//
//    companion object {
//        val instance: PhotosUtils by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { PhotosUtils() }
//    }
//
//    val groupList = mutableListOf<PhotoGroupEntity>()
//
//    val groupImagesList = mutableListOf<PhotoGroupEntity>()
//
//    val groupVideoList = mutableListOf<PhotoGroupEntity>()
//
//    private var contentResolver: ContentResolver? = null
//
//    fun init(context: Context) {
//        contentResolver = context.contentResolver
//        Thread {
//            getAllImages()
//        }.start()
//    }
//
//    fun onRefresh() {
////        queryMediaFiles()
//        getAllImages()
//    }
//
//    /**
//     * 根据资源ID获取媒体
//     */
//    fun getPhotoById(id: Long): PhotosEntity? {
//        if (groupList.isEmpty()) return null
//        try {
//            return groupList[0].photos.first { it.id == id }
//        } catch (e: Exception) {
//            e.printStackTrace()
//        }
//        return null
//    }
//
//    fun addPhotoToGroup(bean: PhotosEntity) {
//        if (bean.type!!.contains("image")) {
//            val index = groupImagesList.indexOfFirst { it.name == bean.group }
//            if (index >= 0) {
//                groupImagesList[index].photos.add(0, bean)
//            } else {
//                groupImagesList.add(PhotoGroupEntity(bean.group!!, 3, mutableListOf(bean)))
//            }
//            groupImagesList[0].photos.add(0, bean)
//        } else if (bean.type.contains("video")) {
//            val index = groupVideoList.indexOfFirst { it.name == bean.group }
//            if (index >= 0) {
//                groupVideoList[index].photos.add(0, bean)
//            } else {
//                groupVideoList.add(PhotoGroupEntity(bean.group!!, 3, mutableListOf(bean)))
//            }
//            groupVideoList[0].photos.add(0, bean)
//        }
//        val groupIndex = groupList.indexOfFirst { it.name == bean.group }
//        if (groupIndex >= 0) {
//            groupList[groupIndex].photos.add(0, bean)
//        } else {
//            groupList.add(PhotoGroupEntity(bean.group!!, 3, mutableListOf(bean)))
//        }
//        groupList[0].photos.add(0, bean)
//    }
//
//    /**
//     * 根据路径获取图片
//     */
//    fun getImageById(id: String): PhotosEntity? {
//        val imagesUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
//        val projection = arrayOf(
//            MediaStore.Images.Media._ID,
//            MediaStore.Images.Media.DATA,
//            MediaStore.Images.Media.MIME_TYPE,
//            MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
//            MediaStore.Images.Media.DURATION,
//            MediaStore.Images.Media.DATE_ADDED,
//            MediaStore.Images.Media.DATE_MODIFIED,
//            MediaStore.Images.Media.WIDTH,
//            MediaStore.Images.Media.HEIGHT,
//            MediaStore.Images.Media.SIZE,
//        )
//        val orderBy = "${MediaStore.Images.Media.DATE_MODIFIED} DESC"
//        val dataList = mutableListOf<PhotosEntity>()
//        val cursor = contentResolver?.query(imagesUri, projection, MediaStore.Images.Media._ID + "='" + id + "'", null, orderBy)
//        cursor?.use {
//            dataList.addAll(toEntity(1, it))
//        }
//        cursor?.close()
//        return if (dataList.isEmpty()) null else dataList.first()
//    }
//
//    /**
//     * 根据路径获取视频
//     */
//    fun getVideoById(id: String): PhotosEntity? {
//        val videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
//        val projection = arrayOf(
//            MediaStore.Video.Media._ID,
//            MediaStore.Video.Media.DATA,
//            MediaStore.Video.Media.MIME_TYPE,
//            MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
//            MediaStore.Video.Media.DURATION,
//            MediaStore.Video.Media.DATE_ADDED,
//            MediaStore.Video.Media.DATE_MODIFIED,
//            MediaStore.Video.Media.WIDTH,
//            MediaStore.Video.Media.HEIGHT,
//            MediaStore.Video.Media.SIZE,
//        )
//        val orderBy = "${MediaStore.Video.Media.DATE_MODIFIED} DESC"
//        val dataList = mutableListOf<PhotosEntity>()
//        val cursor = contentResolver?.query(videoUri, projection, MediaStore.Video.Media._ID + "='" + id + "'", null, orderBy)
//        cursor?.use {
//            dataList.addAll(toEntity(2, it))
//        }
//        cursor?.close()
//        return if (dataList.isEmpty()) null else dataList.first()
//    }
//
//    /**
//     * 获取媒体资源
//     */
//    private fun getAllImages() {
//        val dataList = mutableListOf<PhotosEntity>()
//        dataList.addAll(queryImages())
//        dataList.addAll(queryVideos())
//        dataList.sortByDescending { it.dateTime }
//        val temp = groupList.flatMap { it.photos }.toList()
//        for (e in dataList) {
//            if (e.id != null) {
//                val t = temp.firstOrNull { it.id == e.id }
//                if (t != null) {
//                    continue
//                }
//            }
//            if (StringUtils.isEmpty(e.path)) {
//                continue
//            }
//            val file = File(e.path!!)
//            if (!file.exists()) {
//                continue
//            }
//            // 先做图片视频分集
//            if (e.type!!.contains("image")) {
//                // 添加图片集
//                val groupIndex = groupList.indexOfFirst { it.name == "Images" }
//                if (groupIndex >= 0) {
//                    groupList[groupIndex].photos.add(e)
//                } else {
//                    groupList.add(PhotoGroupEntity("Images", 1, mutableListOf(e)))
//                }
//            } else if (e.type.contains("video")) {
//                // 添加视频集
//                val groupIndex = groupList.indexOfFirst { it.name == "Videos" }
//                if (groupIndex >= 0) {
//                    groupList[groupIndex].photos.add(e)
//                } else {
//                    groupList.add(PhotoGroupEntity("Videos", 2, mutableListOf(e)))
//                }
//            }
//
//            // 再分目录集
//            val groupIndex = groupList.indexOfFirst { it.name == e.group }
//            if (groupIndex >= 0) {
//                groupList[groupIndex].photos.add(e)
//            } else {
//                groupList.add(PhotoGroupEntity(e.group!!, 3, mutableListOf(e)))
//            }
//        }
//        if (dataList.isNotEmpty()) {
//            // 默认第一个展示最近集
//            if (groupList.isNotEmpty() && groupList[0].name == "Recents") {
//                groupList[0].photos.clear()
//                groupList[0].photos.addAll(dataList)
//            } else {
//                groupList.add(0, PhotoGroupEntity("Recents", 0, dataList))
//            }
//        }
//        groupList.sortBy { it.sort }
//    }
//
//    private fun queryMediaFiles(): List<String> {
//        val filePaths = mutableListOf<String>()
//        val uri = MediaStore.Files.getContentUri("external")
//        val projection = arrayOf(
//            MediaStore.Files.FileColumns._ID,
//            MediaStore.Files.FileColumns.DATA,
//            MediaStore.Files.FileColumns.MIME_TYPE,
//        )
//        val selection = "${MediaStore.Files.FileColumns.MEDIA_TYPE}=? OR ${MediaStore.Files.FileColumns.MEDIA_TYPE}=?"
//        val selectionArgs = arrayOf(
//            MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE.toString(),
//            MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO.toString()
//        )
//        val sortOrder = "${MediaStore.Files.FileColumns.DATE_ADDED} DESC"
//
//        contentResolver?.query(uri, projection, selection, selectionArgs, sortOrder)?.use { cursor ->
//            val idIndex = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID)
//            val pathIndex = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA)
//            while (cursor.moveToNext()) {
//                val id = cursor.getLong(idIndex)
//                val filePath = cursor.getString(pathIndex)
//                if (filePath != null) {
//                    if (isValidFile(filePath)) {
//                        filePaths.add(filePath)
//                    } else {
//                        val uir = Uri.parse(filePath)
//                        if (uir != null) {
//                            contentResolver?.delete(uri, null, null)
//                        }
//                    }
//                } else {
//                    contentResolver?.delete(uri, MediaStore.Files.FileColumns._ID + "=?", arrayOf(id.toString()))
//                }
//            }
//        }
//        return filePaths
//    }
//
//    private fun isValidFile(path: String): Boolean {
//        val file = File(path)
//        return file.exists() && file.length() > 0
//    }
//
//    /**
//     * 查询所有图片
//     */
//    private fun queryImages(): List<PhotosEntity> {
//        val imagesUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
//        val projection = arrayOf(
//            MediaStore.Images.Media._ID,
//            MediaStore.Images.Media.DATA,
//            MediaStore.Images.Media.MIME_TYPE,
//            MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
//            MediaStore.Images.Media.DURATION,
//            MediaStore.Images.Media.DATE_ADDED,
//            MediaStore.Images.Media.DATE_MODIFIED,
//            MediaStore.Images.Media.WIDTH,
//            MediaStore.Images.Media.HEIGHT,
//            MediaStore.Images.Media.SIZE,
//        )
////        val orderBy = "${MediaStore.Images.Media.DATE_MODIFIED} DESC LIMIT 100"
////        val cursor = contentResolver?.query(imagesUri, projection, null, null, orderBy)
//
//        val cursor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            val bundle = Bundle().apply {
//                putInt(
//                    ContentResolver.QUERY_ARG_SORT_DIRECTION,
//                    ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
//                )
//                putStringArray(
//                    ContentResolver.QUERY_ARG_SORT_COLUMNS,
//                    arrayOf(MediaStore.Files.FileColumns._ID)
//                )
//                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
//                    putInt(ContentResolver.QUERY_ARG_SQL_LIMIT, 100)
//                }else {
//                    putInt(ContentResolver.QUERY_ARG_LIMIT, 100)
//                }
//            }
//            contentResolver?.query(imagesUri, projection, bundle, null)
//        } else {
//            val orderBy = "${MediaStore.Video.Media.DATE_MODIFIED} DESC LIMIT 100"
//            contentResolver?.query(imagesUri, projection, null, null, orderBy)
//        }
//
//        val dataList = mutableListOf<PhotosEntity>()
//        cursor?.use { c ->
//            val list = toEntity(0, c)
//            dataList.addAll(list)
//            for (e in list) {
//                val groupIndex = groupImagesList.indexOfFirst { it.name == e.group }
//                if (groupIndex >= 0) {
//                    groupImagesList[groupIndex].photos.add(e)
//                } else {
//                    groupImagesList.add(PhotoGroupEntity(e.group!!, 3, mutableListOf(e)))
//                }
//            }
//            val bean = PhotoGroupEntity("Recents", 0, list.toMutableList())
//            groupImagesList.add(0, bean)
//        }
//        cursor?.close()
//        return dataList
//    }
//
//    /**
//     * 查询所有视频
//     */
//    private fun queryVideos(): List<PhotosEntity> {
//        val videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
//        val projection = arrayOf(
//            MediaStore.Video.Media._ID,
//            MediaStore.Video.Media.DATA,
//            MediaStore.Video.Media.MIME_TYPE,
//            MediaStore.Video.Media.BUCKET_DISPLAY_NAME,
//            MediaStore.Video.Media.DURATION,
//            MediaStore.Video.Media.DATE_ADDED,
//            MediaStore.Video.Media.DATE_MODIFIED,
//            MediaStore.Video.Media.WIDTH,
//            MediaStore.Video.Media.HEIGHT,
//            MediaStore.Video.Media.SIZE,
//        )
////        val orderBy = "${MediaStore.Video..Media.DATE_MODIFIED} DESC LIMIT 100"
////        val cursor = contentResolver?.query(videoUri, projection, null, null, orderBy)
//
//        val cursor = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            val bundle = Bundle().apply {
//                putInt(
//                    ContentResolver.QUERY_ARG_SORT_DIRECTION,
//                    ContentResolver.QUERY_SORT_DIRECTION_DESCENDING
//                )
//                putStringArray(
//                    ContentResolver.QUERY_ARG_SORT_COLUMNS,
//                    arrayOf(MediaStore.Video.Media.DATE_ADDED, MediaStore.Video.Media.DATE_MODIFIED)
//                )
//                putInt(ContentResolver.QUERY_ARG_LIMIT, 10)
//            }
//            contentResolver?.query(videoUri, projection, bundle, null)
//        } else {
//            val orderBy = "${MediaStore.Video.Media.DATE_MODIFIED} DESC LIMIT 10"
//            contentResolver?.query(videoUri, projection, null, null, orderBy)
//        }
//
//        val dataList = mutableListOf<PhotosEntity>()
//        cursor?.use { c ->
//            val list = toEntity(2, c)
//            dataList.addAll(list)
//            for (e in list) {
//                val groupIndex = groupVideoList.indexOfFirst { it.name == e.group }
//                if (groupIndex >= 0) {
//                    groupVideoList[groupIndex].photos.add(e)
//                } else {
//                    groupVideoList.add(PhotoGroupEntity(e.group!!, 3, mutableListOf(e)))
//                }
//            }
//            val bean = PhotoGroupEntity("Recents", 0, list.toMutableList())
//            groupVideoList.add(0, bean)
//        }
//        cursor?.close()
//        return dataList
//    }
//
//    /**
//     * 通过游标获取实体
//     */
//    fun toEntity(mediaType: Int, it: Cursor): List<PhotosEntity> {
//        val dataList = mutableListOf<PhotosEntity>()
//        // ID
//        val idColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns._ID
//                2 -> MediaStore.Video.VideoColumns._ID
//                else -> MediaStore.MediaColumns._ID
//            }
//        )
//        // 路径
//        val pathColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.DATA
//                2 -> MediaStore.Video.VideoColumns.DATA
//                else -> MediaStore.MediaColumns.DATA
//            }
//        )
//        // 类型
//        val typeColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.MIME_TYPE
//                2 -> MediaStore.Video.VideoColumns.MIME_TYPE
//                else -> MediaStore.MediaColumns.MIME_TYPE
//            }
//        )
//        // 类别
//        val groupColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME
//                2 -> MediaStore.Video.VideoColumns.BUCKET_DISPLAY_NAME
//                else -> MediaStore.MediaColumns.BUCKET_DISPLAY_NAME
//            }
//        )
//        // 时长
//        val durationColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.DURATION
//                2 -> MediaStore.Video.VideoColumns.DURATION
//                else -> MediaStore.MediaColumns.DURATION
//            }
//        )
//        // 添加时间
//        val dateColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.DATE_ADDED
//                2 -> MediaStore.Video.VideoColumns.DATE_ADDED
//                else -> MediaStore.MediaColumns.DATE_ADDED
//            }
//        )
//        // 修改时间
//        val updateDateColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.DATE_MODIFIED
//                2 -> MediaStore.Video.VideoColumns.DATE_MODIFIED
//                else -> MediaStore.MediaColumns.DATE_MODIFIED
//            }
//        )
//        // 高
//        val heightColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.HEIGHT
//                2 -> MediaStore.Video.VideoColumns.HEIGHT
//                else -> MediaStore.MediaColumns.HEIGHT
//            }
//        )
//        // 宽
//        val widthColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.WIDTH
//                2 -> MediaStore.Video.VideoColumns.WIDTH
//                else -> MediaStore.MediaColumns.WIDTH
//            }
//        )
//        // 大小
//        val sizeColumn = it.getColumnIndexOrThrow(
//            when (mediaType) {
//                1 -> MediaStore.Images.ImageColumns.SIZE
//                2 -> MediaStore.Video.VideoColumns.SIZE
//                else -> MediaStore.MediaColumns.SIZE
//            }
//        )
//        while (it.moveToNext()) {
//            val id = it.getLong(idColumn)
//            val path = it.getString(pathColumn)
//            val type = it.getString(typeColumn)
//            val group = it.getString(groupColumn)
//            var duration = it.getLong(durationColumn)
//            val date = it.getLong(dateColumn)
//            val updateDate = it.getLong(updateDateColumn)
//            val height = it.getInt(heightColumn)
//            val width = it.getInt(widthColumn)
//            val size = it.getInt(sizeColumn)
//            val file = File(path)
//            if (!file.exists() || !file.canRead() || file.length() <= 0) {
//                continue
//            }
//            val data = if (type.contains("image")) {
//                PhotosEntity(
//                    id = id,
//                    path = path,
//                    thumbnail = null,
//                    type = type,
//                    group = group,
//                    duration = duration,
//                    dateTime = date,
//                    updateTime = updateDate,
//                    width = width,
//                    height = height,
//                    size = size
//                )
//            } else {
//                val thumbnail = getThumbnail(path)
//                duration = if (duration == 0L) getVideoDuration(path) else duration
//                PhotosEntity(
//                    id = id,
//                    path = path,
//                    thumbnail = thumbnail,
//                    type = type,
//                    group = group,
//                    duration = duration,
//                    dateTime = date,
//                    updateTime = updateDate,
//                    width = width,
//                    height = height,
//                    size = size
//                )
//            }
//            dataList.add(data)
//        }
//        return dataList
//    }
//
//    /**
//     * 获取视频封面
//     */
//    private fun getThumbnail(path: String): String? {
//        val retriever = MediaMetadataRetriever()
//        return try {
//            val file = File(path)
//            if (!file.exists()) {
//                return null
//            }
//            retriever.setDataSource(path)
//            val bitmap = retriever.frameAtTime ?: return null
//
//            val fileName = file.nameWithoutExtension
//            val oldFile = File(FileUtils.getFilePath(), "$fileName.jpg")
//
//            if (oldFile.exists()) {
//                return oldFile.absolutePath
//            }
//
//            val newFile = ImageUtils.saveBitmapToStorage(bitmap, "$fileName.jpg")
//            newFile?.absolutePath
//        } catch (e: IllegalArgumentException) { // 数据源错误
//            L.e("数据源错误：\n${path}\n", e)
//            e.printStackTrace()
//            null
//        } catch (e: RuntimeException) { // retriever 解析错误
//            L.e("解析错误：\n${path}\n", e)
//            e.printStackTrace()
//            null
//        } finally {
//            retriever.release()
//        }
//    }
//
//
//    /**
//     * 获取视频时长 (单位: 毫秒)
//     * @param path 视频 Uri
//     */
//    private fun getVideoDuration(path: String): Long {
//        return try {
//            MediaMetadataRetriever().use { retriever ->
//                retriever.setDataSource(path)
//                retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)?.toLong() ?: 0L
//            }
//        } catch (e: IllegalArgumentException) { // 可能是无效文件路径
//            e.printStackTrace()
//            0L
//        } catch (e: RuntimeException) { // retriever 解析失败
//            e.printStackTrace()
//            0L
//        }
//    }
//
//}